<?php 
namespace town\base;

use town\base\Store;
use town\base\FilterChain;

class Request
{
    private static $obj = null;

    public $route = null;


    /**
     * http方法
     */
    public function method()
    {
        return $_SERVER['REQUEST_METHOD'];
    }


    /**
     * 获取所有请求参数
     */
    private function all()
    {
        return Store::val();
    }


    /**
     * 获取请求参数
     */
    private function val($key, $default = null)
    {
        $val = Store::val($key);
        return ($val === null) ? $default : $val; 
    }

    /**
     * 获取get值
     * @param  string $key     key
     * @param  mixed  $default 默认值,没取到这个值就就获取这个值
     * @return [type]          [description]
     */
    private function get($key, $default = null)
    {
        $val = Store::get($key);
        return ($val === null) ? $default : $val; 
    }

    /**
     * 获取post值
     * @param  string $key      key
     * @param  mixed  $default  默认值
     * @return mixed
     */
    private function post($key, $default = null)
    {
        $val = Store::post($key);
        return ($val === null) ? $default : $val; 
    }


    /**
     * 是否有值
     * @param  string  $key 键
     * @return boolean
     */
    private function hasV($key)
    {
        // TODO::检测值
    }


    /**
     * 执行过滤
     */
    private function initFilter($filter)
    {
        // 初始化链对象
        FilterChain::init($filter);
    }


    /**
     * 执行过滤
     */
    private function addFilter($filter)
    {
        // 初始化链对象
        FilterChain::addFilter($filter);
    }
    

    /**
     * [doFilter description]
     * @return [type] [description]
     */
    private function doFilter()
    {
    	return FilterChain::doFilter($this);
    }


    /**
     * 初始化数据
     */
    private function initData($data)
    {

        // 初始化uri的参数
        Store::init($data);

        // 初始化$_GET参数

        // 初始化$_POST参数
    }


    public function __call($method, $arguments)
    {
        if (method_exists($this, $method)) {
            return call_user_func_array([$this, $method], $arguments);
        }
    }
    
    public static function __callStatic($method, $arguments)
    {
        $obj = static::singleton();
        if (method_exists($obj, $method)) {
            return call_user_func_array([$obj, $method], $arguments);
        }
    }

    public static function singleton()
    {
        if (static::$obj == null) {
            static::$obj = new static();
        }
        return static::$obj;
    }
}
